package com.ledi.guns.core.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;

public class ToPdf {

	protected final static Logger logger = LoggerFactory.getLogger(ToPdf.class);

	/**
	 * 方法描述: [图片转PDF.]<br/>
	 * 初始作者: 钟小平<br/>
	 * 创建日期: 2018年7月7日-下午4:28:26<br/>
	 * 开始版本: 2.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 * 
	 * @param imageName
	 *            输入图片
	 * @param outputPdfName
	 *            输出地址
	 */
	public static boolean imgMerageToPdf(File imageIn, File file, HttpServletResponse response) throws Exception {

		// 1：对图片文件通过TreeMap以名称进行自然排序
		response.reset(); // 必要地清除response中的缓存信息
		response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());// 在浏览器提示用户是保存还是下载
		response.setContentType("multipart/form-data; charset=UTF-8");// 根据个人需要,这个是下载文件的类型
		response.setHeader("Content-Length", String.valueOf(file.length()));// 告诉浏览器下载文件的大小
		// 2：获取第一个Img的宽、高做为PDF文档标准
		ByteArrayOutputStream baos = new ByteArrayOutputStream(2048 * 3);
		InputStream is = new FileInputStream(imageIn);
		for (int len; (len = is.read()) != -1;) {
			baos.write(len);
		}

		baos.flush();
		Image image = Image.getInstance(baos.toByteArray());
		float width = image.width();
		float height = image.height();
		baos.close();
		logger.info("width>>" + width);
		logger.info("height>>" + height);
		// 3:通过宽高 ，实例化PDF文档对象。
		Document document = new Document(new Rectangle(width, height));
		PdfWriter pdfWr = PdfWriter.getInstance(document, new FileOutputStream(file));
		document.open();

		// 4：获取每一个图片文件，转为IMG对象。装载到Document对象中

		// 4.1:读取到内存中
		baos = new ByteArrayOutputStream(2048 * 3);
		is = new FileInputStream(imageIn);
		for (int len; (len = is.read()) != -1;) {
			baos.write(len);
		}
		baos.flush();

		// 4.2通过byte字节生成IMG对象
		image = Image.getInstance(baos.toByteArray());
		Image.getInstance(baos.toByteArray());
		image.setAbsolutePosition(0.0f, 0.0f);

		// 4.3：添加到document中
		document.add(image);
		document.newPage();
		baos.close();

		// 5：释放资源
		document.close();
		pdfWr.close();
		logger.info("图片转PDF成功");
		return true;
	}

	/**
	 * 第一种解决方案
	 * 在不改变图片形状的同时，判断，如果h>w，则按h压缩，否则在w>h或w=h的情况下，按宽度压缩
	 * 
	 * @param h
	 * @param w
	 * @return
	 */

	public int getPercent(float h, float w)
	{

		int p = 0;
		float p2 = 0.0f;
		if (h > w)
		{
			p2 = 297 / h * 100;
		}
		else
		{
			p2 = 210 / w * 100;
		}
		p = Math.round(p2);
		return p;
	}

	/**
	 * 第二种解决方案，统一按照宽度压缩
	 * 这样来的效果是，所有图片的宽度是相等的，自我认为给客户的效果是最好的
	 * 
	 * @param args
	 */
	public static int getPercent2(float h, float w)
	{

		int p = 0;
		float p2 = 0.0f;
		p2 = 530 / w * 100;
		p = Math.round(p2);
		return p;
	}

	/**
	 * 第三种解决方案，就是直接压缩，不安像素比例，全部压缩到固定值，如210*297
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		ToPdf pt = new ToPdf();
		// pt.imgMerageToPdf(new File("C:/Users/root/Pictures/9c4930bdly1fpg2exl2n9j20qo140gwe.jpg"), new
		// File("C:/Users/root/Pictures/9c4930bdly1fpg2exl2n9j20qo140gwe.pdf"));
	}
}
